package com.holly.unit.db.mp.fieldfill;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.holly.unit.auth.api.context.LoginContext;
import com.holly.unit.core.enums.StatusEnum;
import com.holly.unit.core.enums.YesOrNotEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.ReflectionException;

import java.lang.reflect.Field;
import java.util.Date;

import static com.holly.unit.db.api.constants.DbFieldConstants.*;

/**
 * 字段自动填充工具，在mybatis-plus执行更新和新增操作时候，会对指定字段进行自动填充，例如 create_time 等字段
 *
 * @author holly
 * @date 2020/10/16 17:14
 */
@Slf4j
public class CustomMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {

        try {
            // 设置createUser（BaseEntity)
            setValue(metaObject, CREATE_USER, this.getUserUniqueId());

            // 设置createTime（BaseEntity)
            setValue(metaObject, CREATE_TIME, new Date());

            // 设置删除标记 默认N-删除
            setValue(metaObject, DEL_FLAG, YesOrNotEnum.N.getCode());

            // 设置状态字段 默认1-启用
             setValue(metaObject, STATUS_FLAG, StatusEnum.ENABLE.getCode());

        } catch (ReflectionException e) {
            log.warn("CustomMetaObjectHandler处理过程中无相关字段，不做处理");
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {

        try {
            // 设置updateUser（BaseEntity)
            setValue(metaObject, UPDATE_USER, this.getUserUniqueId());

            // 设置updateTime（BaseEntity)
            setValue(metaObject, UPDATE_TIME, new Date());
        } catch (ReflectionException e) {
            log.warn("CustomMetaObjectHandler处理过程中无相关字段，不做处理");
        }

    }

    /**
     * 获取用户唯一id
     *
     * @author holly
     * @date 2021/10/29 10:01
     */
    private Long getUserUniqueId() {

        try {
            return LoginContext.me().getLoginUser().getUserId();
        } catch (Exception e) {
            //如果获取不到就返回-1
            return -1L;
        }

    }

    /**
     * 设置属性
     *
     * @author holly
     * @date 2021/10/29 10:01
     */
    private void setValue(MetaObject metaObject, String fieldName, Object value) {

        boolean checkType=true;
        Object originalAttr = getFieldValByName(fieldName, metaObject);

        //如果拦截类中包括delFlag 验证类型如果是int类型添加默认值为0 如果是string按原逻辑处理
        if(metaObject.hasGetter("delFlag")  && "delFlag".equals(fieldName) ){
            if(metaObject.getGetterType("delFlag").getName().equals("java.lang.Integer")){
                if (ObjectUtil.isEmpty(originalAttr)) {
                    setFieldValByName(fieldName, 0, metaObject);
                    checkType=false;
                }
            }
        }

        if(checkType) {
            if (ObjectUtil.isEmpty(originalAttr)) {
                setFieldValByName(fieldName, value, metaObject);
            }
        }
    }

}
